﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Ext.Net;
using Sio.Mdm.Entities;
using Sio.Mdm.Client;
using Sio.Mdm.BF.Idm;
using Sio.Mdm.BF.Sifranti;
using Sio.Mdm.Types.Database;
using Sio.Mdm.Types;
using Sio.Mdm.BF.Ldap;
using System.Collections.Generic;

namespace Sio.Mdm.Web.Instalacija
{
    public partial class AdministratorjiSeznam : Controls.Page
    {
        #region Definitions
        public interface AdministratorRowEditData
        {
            int IdmStevilka { get; set; }
            int VlogaId { get; set; }
            string Ime { get; set; }
            string Priimek { get; set; }
            int Spol { get; set; }
            string UporabniskoIme { get; set; }
            string EMail { get; set; }
        }
        #endregion


        #region Methods

        #region Protected

        #region OnLoad
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (!IsPostBack && !X.IsAjaxRequest)
            {
                /*
                //občine
                EntityCollection<Obcina> obcine = new EntityCollection<Obcina>(
				  new Filter<Obcina>().Where(o => o.ObcinaId != null).OrderBy(o => o.Naziv));
                this.StoreObcine.DataSource = obcine;
                this.StoreObcine.DataBind();

                //pošte
                //var slServicePoste = ServiceFactory.GetService<IPostneStevilkeService>();
                EntityCollection<PostnaStevilka> postneStevilke = new EntityCollection<PostnaStevilka>(
									new Filter<PostnaStevilka>().Where(p => p.PostaId != null).OrderBy(p => p.PostnaStevilka));
                this.StorePoste.DataSource = postneStevilke;
                this.StorePoste.DataBind();
                */
                //spoli
                Dictionary<int, string> listSpoli = new Dictionary<int, string>();
                listSpoli.Add(0, "moški");
                listSpoli.Add(1, "ženski");
                var tmpArray = (from p in listSpoli select new Object[2] { p.Key, p.Value }).ToArray();

                this.StoreSpoli.DataSource = tmpArray;
                this.StoreSpoli.DataBind();
                NaloziSeznamAdministratorjev();
            }
        }
        #endregion

        #region Editing
        protected void UrediPodatke(Object sender, DirectEventArgs e)
        {
            AdministratorRowEditData EditData = XML.Deserialize<AdministratorRowEditData>(e.ExtraParams["data"]);

            if (EditData.IdmStevilka == -99)
            {
                Administrator ent = EntityFactory.CreateInstance<Administrator>();
                ent.Priimek = EditData.Priimek;
                ent.Ime = EditData.Ime;
                ent.UporabniskoIme = EditData.UporabniskoIme;
                ent.Geslo = EditData.UporabniskoIme;
                ent.EMail = EditData.EMail;
                ent.OrganizacijaId = 0; //vstavljam vedno v organizacijo 0
                ent.TipVlogeId = 0;
                //ent.Spol = EditData.Spol;
                ent.Spol = 0;
                ent.Update();
                NaloziSeznamAdministratorjev();
            }
            else
            {
                Administrator admin = EntityFactory.LoadEntity<Administrator>(
                    new Filter<Administrator>().Where(r => (r.IdmStevilka == EditData.IdmStevilka) && (r.OrganizacijaId == 0))); //vedno urejam podatke ki se tičejo organizacije 0
                if (admin.EntityState == EntityState.Unchanged)
                {
                    admin.Ime = EditData.Ime;
                    admin.Priimek = EditData.Priimek;
                    admin.UporabniskoIme = EditData.UporabniskoIme;
                    admin.EMail = EditData.EMail;

                    /*
                    admin.Naslov = EditData.Naslov;

                    admin.PostaId = EditData.PostaId;
                    if (admin.PostaId < 1)
                    {
                        admin.PostaId = null;
                    }

                    admin.ObcinaId = EditData.ObcinaId;
                    if (admin.ObcinaId < 1)
                    {
                        admin.ObcinaId = null;
                    }
                    */

                    admin.Spol = EditData.Spol;
                    admin.Update();
                }
            }
        }
        protected void OdstraniAdministratorje(object sender, DirectEventArgs e)
        {
            List<int> deletedItems = e.GetIdList<int>("selected", "IdmStevilka");

            //brisanje root/root uporabnika ni dovoljeno
            if (deletedItems.IndexOf(0) > -1)
                deletedItems.Remove(0);

            if (deletedItems.Count > 0)
            {
                EntityCollection<Administrator> col = new EntityCollection<Administrator>(
                    new Filter<Administrator>().SelectByField(r => r.IdmStevilka, deletedItems.ToArray())
                );

                col.RemoveAll();
                col.Update();
            }
        }

        [DirectMethod]
        public void NastaviGeslo(string bla)
        {
        }

        [DirectMethod]
        public void OdpriPodrobnosti(string json)
        {
            var args = JSON.Deserialize<Dictionary<string, string>[]>(json);

        }

        #endregion



        #endregion

        #region Private
        private void NaloziSeznamAdministratorjev()
        {
            GridUceciSeznam.LoadData<Administrator>(
                new Filter<Administrator>().Where(r => r.OrganizacijaId == 0).OrderBy(r => r.Priimek));
            /*

            //učeči
            int letoId = Request.GetValue<int>("letoid");
            int razredId = Request.GetValue<int>("razredid");//razred+paralelka
            int razred = Request.GetValue<int>("razred");//samo razred

            if (razredId > 0)
            {   
                GridUceciSeznam.LoadData<Administrator>(
                    from r in new Filter<Administrator>()
                        join s in new Filter<UcecStatus>() on r.VlogaId equals s.VlogaId
                        join p in new Filter<RazredSkupina>() on s.RazredId equals p.RazredId
                        where
                            s.LetoId == letoId &&
                            p.LetoId == s.LetoId &&
                            s.RazredId == razredId
                    select r
                );
                //GridUceciSeznam.LoadData<Ucec, UcecStatus, RazredSkupina>(
                //    (r, s, p) => (r.VlogaId == s.VlogaId)
                //        && (s.LetoId == letoId) && (s.RazredId == razredId)
                //        && (p.RazredId == s.RazredId) && (p.LetoId == s.LetoId)
                //);
            }
            else if (razred > 0)
            {
                GridUceciSeznam.LoadData<Administrator>(
                    from r in new Filter<Administrator>() 
                        join s in new Filter<UcecStatus>() on r.VlogaId equals s.VlogaId
                        join p in new Filter<RazredSkupina>() on s.RazredId equals p.RazredId
                             where
                                s.LetoId == letoId && 
                                p.Razred == razred &&
                                p.LetoId == s.LetoId
                    select r
                );
            }
            else
            {
                GridUceciSeznam.LoadData<Administrator>(
                    from r in new Filter<Administrator>()
                        join s in new Filter<UcecStatus>() on r.VlogaId equals s.VlogaId
                        join p in new Filter<RazredSkupina>() on s.RazredId equals p.RazredId
                            where
                               s.LetoId == letoId &&                               
                               p.LetoId == s.LetoId
                    select r
                );

                //        (r, s, p) => (r.VlogaId == s.VlogaId) && (s.LetoId == letoId)
                //        && (p.LetoId == s.LetoId) && (p.RazredId == s.RazredId) && (p.LetoId == s.LetoId)
                //);
            }*/
        }

        private List<int> GetSelectedList(string jsonString)
        {
            List<int> list = new List<int>();

            Dictionary<string, string>[] rows = JSON.Deserialize<Dictionary<string, string>[]>(jsonString);
            foreach (Dictionary<string, string> row in rows)
            {
                foreach (KeyValuePair<string, string> vals in row)
                {
                    if (vals.Key == "IdmStevilka")
                    {
                        list.Add(Int32.Parse(vals.Value));
                    }
                }
            }

            return list;
        }


        #endregion

        #endregion

        protected void GridDodeljenoRefresh(object sender, StoreRefreshDataEventArgs e)
        {
            string id = e.Parameters["IdmStevilka"];
            NaloziSeznamOrganizacij(Int32.Parse(id));
        }

        protected void DodajOrganizacije(object sender, DirectEventArgs e)
        {
            List<int> id = e.GetIdList<int>("selected", "OrganizacijaId");
            int IdmStevilka = e.DeserializeParameter<int>("IdmStevilka");

            if (id.Count > 0 && IdmStevilka > 0)
            {
                //naložim originalne podatke
                Administrator admin = EntityFactory.LoadEntity<Administrator>(
                    new Filter<Administrator>().Where(r => (r.IdmStevilka == IdmStevilka) && (r.OrganizacijaId == 0))); //vedno urejam podatke ki se tičejo organizacije 0

                foreach (var OrganizacijaID in id)
                {
                    //podvojim administratorja za vsako
                    Administrator ent = EntityFactory.CreateInstance<Administrator>();
                    ent.Priimek = admin.Priimek;
                    ent.Ime = admin.Ime;
                    ent.UporabniskoIme = admin.UporabniskoIme;
                    ent.Geslo = admin.Geslo;
                    ent.EMail = admin.EMail;
                    ent.OrganizacijaId = OrganizacijaID;
                    ent.TipVlogeId = 1;
                    ent.Spol = admin.Spol;
                    ent.Update();
                }
            }
        }

        protected void OdstraniOrganizacije(object sender, DirectEventArgs e)
        {
            List<int> id = e.GetIdList<int>("selected", "OrganizacijaId");
            int IdmStevilka = e.DeserializeParameter<int>("IdmStevilka");
            if (id.Count > 0 && IdmStevilka > 0)
            {
                //naložim originalne podatke
                Administrator admin = EntityFactory.LoadEntity<Administrator>(
                    new Filter<Administrator>().Where(r => (r.IdmStevilka == IdmStevilka) && (r.OrganizacijaId == 0))); //vedno urejam podatke ki se tičejo organizacije 0

                EntityCollection<Administrator> col = new EntityCollection<Administrator>(
                    new Filter<Administrator>().Where(r => (r.Ime == admin.Ime) && (r.Priimek == admin.Priimek) && (r.UporabniskoIme == admin.UporabniskoIme) && (r.OrganizacijaId != 0)).SelectByField(r => r.OrganizacijaId, id.ToArray())
                );
                col.RemoveAll();
                col.Update();
            }
        }

        private void NaloziSeznamOrganizacij(int IdmStevilka)
        {
            if (IdmStevilka < 1)
            {
                GridDodeljeno.LoadData<Sio.Mdm.Types.Database.Organizacija>(
                    new Filter<Sio.Mdm.Types.Database.Organizacija>().Where(r => r.OrganizacijaId != null));

                GridNeDodeljeno.LoadData<Sio.Mdm.Types.Database.Organizacija>(
                    new Filter<Sio.Mdm.Types.Database.Organizacija>().Where(r => r.OrganizacijaId == null));

                return;
            }


            Administrator admin = EntityFactory.LoadEntity<Administrator>(
                new Filter<Administrator>().Where(r => (r.IdmStevilka == IdmStevilka) && (r.OrganizacijaId == 0))); //vedno urejam podatke ki se tičejo organizacije 0

            var a = String.Format(":{0}:{1}:{2}", admin.Ime, admin.Priimek, admin.UporabniskoIme);


            //var test = new EntityCollection<FunkcionalnostZeton>(new Filter<FunkcionalnostZeton>().Where(r => r.FunkcionalnostId == funkcionalnostId));
            //GridDodeljeno.LoadData<VarnostniZeton>(
            //    new Filter<VarnostniZeton>().LeftJoin(new Filter<FunkcionalnostZeton>(), r => r.VarnostniZetonId.ToString() + a.ToString(), s => s.VarnostniZetonId.ToString() + ':' + s.FunkcionalnostId.ToString(), (r, s) => r, (j, k) => (k.VarnostniZetonId != null)).OrderBy(r => r.Naziv));
            GridDodeljeno.LoadData<Sio.Mdm.Types.Database.Organizacija>(
                new Filter<Sio.Mdm.Types.Database.Organizacija>().LeftJoin(new Filter<Administrator>(), r => r.OrganizacijaId.ToString() + a, s => s.OrganizacijaId.ToString() + ':' + s.Ime + ':' + s.Priimek + ':' + s.UporabniskoIme, (r, s) => r, (j, k) => (k.IdmStevilka != null && j.OrganizacijaId != 0)));

            GridNeDodeljeno.LoadData<Sio.Mdm.Types.Database.Organizacija>(
                //   new Filter<Sio.Mdm.Types.Database.Organizacija>().Where(r => r.OrganizacijaId != 0));
                new Filter<Sio.Mdm.Types.Database.Organizacija>().LeftJoin(new Filter<Administrator>(), r => r.OrganizacijaId.ToString() + a, s => s.OrganizacijaId.ToString() + ':' + s.Ime + ':' + s.Priimek + ':' + s.UporabniskoIme, (r, s) => r, (j, k) => (k.IdmStevilka == null && j.OrganizacijaId != 0)));

        }
    }
}
